<?php
/**
 * Verwaltung von Farben
 * 
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2010 Loresoft Software (http://www.loresoft.de)
 * @license		http://yapary.loresoft.de/lizenzbedingungen     New BSD License
 * 
 * @TODO muss komplett ueberarbeitet werden, bzw. mal ueberlegen ob es uebrhaupt noch so gebraucht wird!!
 * 
 * */


Class Yapary_Color_Color
{
	private $red = NULL;
	private $green = NULL;
	private $blue = NULL;



	/**
	* Definiert eine zu speichernde Farbe
	* @param hex $_red : rot {00-FF}
	* @param hex $_green : green {00-FF}
	* @param hex $_blue : blue {00-FF}
	*/
	function __construct ( $_red = NULL, $_green = NULL, $_blue = NULL )
	{
		$this->setColorByHex($_red, $_green, $_blue);
	}
	

	/**
	* Definiert eine zu speichernde Farbe
	* @param int $_red : rot {0-255}
	* @param int $_green : green {0-255}
	* @param int $_blue : blue {0-255}
	* @return bool
	*/
	public function setColorByRgb ( $_red, $_green, $_blue )
	{
		if( is_numeric($_red) && $_red >= 0 && $_red <= 255 )
			if( is_numeric($_green) && $_green >= 0 && $_green <= 255 )
				if( is_numeric($_blue) && $_blue >= 0 && $_blue <= 255 )
				{
					$this->red = (int) $_red;
					$this->green = (int) $_green;
					$this->blue = (int) $_blue;
					return true;
				}

		return false;
	}

	
	
	/**
	* Definiert eine zu speichernde Farbe
	* @param string $_red : rot {00-FF}
	* @param string $_green : green {00-FF}
	* @param string $_blue : blue {00-FF}
	* @return bool
	*/
	public function setColorByHex ( $_red, $_green, $_blue )
	{
		if( is_string($_red) && $this->isHex($_red) )
			if( is_string($_green) && $this->isHex($_green) )
				if( is_string($_blue) && $this->isHex($_blue) )
				{
					$this->red = (string) $_red;
					$this->green = (string) $_green;
					$this->blue = (string) $_blue;
					return true;
				}

		return false;
	}

	
	
	/**
	* Definiert eine zu speichernde Farbe
	* @param string $_red : rot {00-FF}
	* @param string $_green : green {00-FF}
	* @param string $_blue : blue {00-FF}
	* @return bool
	*/
	public function setColorByInt ( $hexInt )
	{
	    if (!is_numeric($hexInt)) {
	        return false;    
	    }
	    
        $r = ($hexInt >> 16) & 0xFF;
        $g = ($hexInt >> 8) & 0xFF;
        $b = $hexInt & 0xFF;  
	    
		$this->red   = (int) $r;
		$this->green = (int) $g;
		$this->blue  = (int) $b;
		return true;
	}
	
	

	/**
	* Liefert die Farbe als 6-stellige Hex-Zahl im Format [#006699]
	* @return string|NULL
	*/	
	public function getColorByHex ( )
	{
		if( is_NULL($this->red) || is_NULL($this->green) || is_NULL($this->blue) )
			return NULL;
			
		return (string) '#'.$this->getHexRed().$this->getHexGreen().$this->getHexBlue();
	}

		
	/**
	* Liefert die Farbe als Zahlenpaar im Format [255 255 255]
	* @return string|NULL
	*/
	public function getColorByInt ( )
	{
		if( is_NULL($this->red) || is_NULL($this->green) || is_NULL($this->blue) )
			return NULL;

		return (string) $this->getIntRed().' '.$this->getIntGreen().' '.$this->getIntBlue();
	}

	
	public function getHexRed()
	{
		// Wenn Farbe als Hex vorliegt, kann diese direkt zurueck gegeben werden
		// Liegt farbe als Int vor, so muss von Int in Hex umgerechnet werden
		if( is_string($this->red) )
			return $this->red;
		elseif( is_int($this->red) )
			return $this->int2Hex($this->red);
	}	

	public function getHexGreen()
	{
		if( is_string($this->green) )
			return $this->green;
		elseif( is_int($this->green) )
			return $this->int2Hex($this->green);
	}	

	public function getHexBlue()
	{
		if( is_string($this->blue) )
			return $this->blue;
		elseif( is_int($this->blue) )
			return $this->int2Hex($this->blue);
	}	


	public function getIntRed()
	{
		// Wenn Farbe als Int vorliegt, kann diese direkt zurueck gegeben werden
		// Liegt farbe als Hex vor, so muss von Hex in Int umgerechnet werden
		if( is_int($this->red) )
			return $this->red;
		elseif( is_string($this->red) )
			return $this->hex2Int($this->red);
	}	

	public function getIntGreen()
	{
		if( is_int($this->green) )
			return $this->green;
		elseif( is_string($this->green) )
			return $this->hex2Int($this->green);
	}	

	public function getIntBlue()
	{
		if( is_int($this->blue) )
			return $this->blue;
		elseif( is_string($this->blue) )
			return $this->hex2Int($this->blue);		
	}	


	/**
	* Prueft ob es sich um einen zweistelligen Hex-Wert handelt
	* @param string $hex : 2-Stelliger Hex-Wert
	* @return bool
	*/
	private function isHex ( $hex )
	{
		// Hex-Wert in Grossbuchstaben umwandeln, Zeichenlaenge und ASCII-Code Grenzen pruefen
		$hex = strtoupper($hex);

		if( strlen($hex) == 2 )
		{
			$digit1 = ord($hex{0});
			$digit2 = ord($hex{1});
			
			if( ($digit1 >= 48 && $digit1 <= 57) || ($digit1 >= 65 && $digit1 <= 90) )
				if( ($digit2 >= 48 && $digit2 <= 57) || ($digit2 >= 65 && $digit2 <= 90) )
					return true;
		}
		
		return false;
	}

	
	private function int2Hex ( $number )
	{
		$arrHex = array(0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, 10=>'A', 11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F');
		$result = '00';
		$result{0} = $arrHex[floor($number/16)];
		$result{1} = $arrHex[$number%16];
		
		return $result;
	}
	
	
	/**
	 * Wandelt eine Hex-Wert in die entspr. Zahl um
	 * @param string	: einzelner Hex-Wert im Format {00|99|AA||FF|...}
	 * @return string
	 * */
	private function hex2Int( $hex )
	{
		$arrHex = array(0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, 'A'=>10, 'B'=>11, 'C'=>12, 'D'=>13, 'E'=>14, 'F'=>15);
		$digit1 = $arrHex[$hex{0}];
		$digit2 = $arrHex[$hex{1}];
		
		return (int) $digit1*16 + $digit2;
	}

	
}



?>